/*
给一非空的单词列表，返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率，按字母顺序排序。

输入：第1行为k值，第2行单词列表，单词列表以end结尾，
end不属于单词列表中的单词。

2
i love   leetcode  i  love  coding end

输出：
i
love
*/
#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
bool cmp(const pair<string, int> &a, const pair<string, int> &b)
{
    if (a.second != b.second)
    {
        return a.second > b.second; // 按值的从大到小排序
    }
    else
    {
        return a.first < b.first; // 若值相等，按键的从小到大排序
    }
}
int main()
{
    string s = "temp";
    map<string, int>::iterator it;
    int k, i;
    cin >> k;
    while (cin >> s && s != "end")
    {
        mp[s]++;
    }
    vector<pair<string, int>> vec(mp.begin(), mp.end());
    sort(vec.begin(), vec.end(), cmp);
    for (i = 0; i < k && i < vec.size(); ++i)
    {
        cout << vec[i].first << endl;
    }

    return 0;
}

// 老师的
// #include <bits/stdc++.h>
// using namespace std;
// struct node
// {
//     string name;
//     int pinci;

//     friend bool operator<(node &w1, node &w2)
//     {
//         if (w1.pinci == w2.pinci)
//             return w1.name < w2.name;
//         else
//             return w1.pinci > w2.pinci;
//     }
// };
// int main()
// {
//     vector<node> v;
//     struct node t;
//     map<string, int> mymap;
//     map<string, int>::iterator it;
//     string s;
//     int k;
//     cin >> k;

//     while (cin >> s && s != "end")
//     {
//         mymap[s]++;
//     }

//     for (it = mymap.begin(); it != mymap.end(); it++)
//     {
//         t.name = it->first;
//         t.pinci = it->second;
//         v.push_back(t);
//     }
//     sort(v.begin(), v.end());
//     for (int i = 0; i < k; i++)
//         cout << v[i].name << endl;
//     return 0;
// }
